//DEFINE(IA64_TASK_SIGHAND_OFFSET,offsetof (struct task_struct, sighand));
//DEFINE(IA64_TASK_SIGNAL_OFFSET,offsetof (struct task_struct, signal));
//DEFINE(IA64_TASK_TGID_OFFSET, offsetof (struct task_struct, tgid));
- DEFINE(IA64_PGD, offsetof(struct domain, arch.mm));
DEFINE(IA64_TASK_THREAD_KSP_OFFSET, offsetof (struct vcpu, arch._thread.ksp));
DEFINE(IA64_TASK_THREAD_ON_USTACK_OFFSET, offsetof (struct vcpu, arch._thread.on_ustack));
| IA64_DCR_DA | IA64_DCR_DD | IA64_DCR_LC));
#endif
atomic_inc(&init_mm.mm_count);
+#ifndef XEN
current->active_mm = &init_mm;
+#endif
#ifdef XEN
if (current->domain->arch.mm)
#else
{
preempt_disable();
/* this happens for the common case of a single-threaded fork(): */
+#ifdef XEN
+ if (likely(mm == current->domain->arch.mm
+ && atomic_read(&mm->mm_users) == 1))
+#else
if (likely(mm == current->active_mm && atomic_read(&mm->mm_users) == 1))
+#endif
{
local_finish_flush_tlb_mm(mm);
preempt_enable();
extern void domain_relinquish_resources(struct domain *);
struct arch_domain {
- struct mm_struct *active_mm;
struct mm_struct *mm;
unsigned long metaphysical_rr0;
unsigned long metaphysical_rr4;
int breakimm; // from arch_domain (so is pinned)
int starting_rid; /* first RID assigned to domain */
int ending_rid; /* one beyond highest RID assigned to domain */
- struct mm_struct *active_mm;
struct thread_struct _thread; // this must be last
thash_cb_t *vtlb;
struct arch_vmx_struct arch_vmx; /* Virtual Machine Extensions */
};
-#define active_mm arch.active_mm
//#define thread arch._thread
// FOLLOWING FROM linux-2.6.7/include/sched.h
{
#ifdef CONFIG_SMP
flush_tlb_range(vma, (addr & PAGE_MASK), (addr & PAGE_MASK) + PAGE_SIZE);
+#else
+#ifdef XEN
+ if (vma->vm_mm == current->domain->arch.mm)
#else
if (vma->vm_mm == current->active_mm)
+#endif
ia64_ptcl(addr, (PAGE_SHIFT << 2));
#ifndef XEN
// FIXME SMP?